/*
 * Copyright (c) 2022-2022 All rights Reserved.
 */

package com.driving.core.util;

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;

/**
 * 配置文件读取
 *
 * @author SAGITTAR
 * @since 2017
 */
@RequiredArgsConstructor
@Component(value = "configReader")
public class ConfigReader {

    /**
     * 测试关键字前缀
     */
    private static final String TEST = "test.";

    /**
     * 异常关键字前缀
     */
    private static final String EXCEPTION = "exception.";

    /**
     * 提示消息关键字
     */
    private static final String INFO = "info.";

    private final MessageSource messageSource;

    /**
     * 使用异常类型名获取当前Locale的异常信息，没有则返回null
     * <p>
     * 如果名字是exception.object，则使用object即可
     *
     * @param exceptionKey 异常类型名
     * @param params 填充信息
     * @return 使用异常类型名获取当前Locale的异常信息，没有则返回null
     */
    public String getExceptionMessage(String exceptionKey, Object... params) {
        return getExceptionMessage(exceptionKey, null, params);
    }

    /**
     * 使用异常类型名获取当前Locale的异常信息，没有则返回默认值
     * <p>
     * 如果名字是exception.object，则使用object即可
     *
     * @param exceptionKey 异常类型名
     * @param defaultMsg 默认值
     * @param params 填充信息
     * @return 使用异常类型名获取当前Locale的异常信息，没有则返回默认值
     */
    public String getExceptionMessage(String exceptionKey, String defaultMsg, Object... params) {
        return getExceptionMessage(exceptionKey, defaultMsg, LocaleContextHolder.getLocale(), params);
    }

    /**
     * 使用异常类型名获取异常信息，没有则返回默认值
     * <p>
     * 如果名字是exception.object，则使用object即可
     *
     * @param exceptionKey 异常类型名
     * @param defaultMsg 默认值
     * @param locale 指定的位置
     * @param params 填充信息
     * @return 异常信息
     */
    public String getExceptionMessage(String exceptionKey, String defaultMsg, Locale locale, Object... params) {
        return messageSource.getMessage(EXCEPTION.concat(exceptionKey), params, defaultMsg, locale);
    }

    /**
     * 获取提示信息
     *
     * @param infoKey 提示key
     * @param params 参数列表
     * @return 提示信息
     */
    public String getInfoMessage(String infoKey, Object... params) {
        return getInfoMessage(infoKey, null, params);
    }

    /**
     * 获取提示信息
     *
     * @param infoKey 提示key
     * @param defaultMsg 默认值
     * @param params 参数列表
     * @return 提示信息
     */
    public String getInfoMessage(String infoKey, String defaultMsg, Object... params) {
        return getInfoMessage(infoKey, defaultMsg, LocaleContextHolder.getLocale(), params);
    }

    /**
     * 获取提示信息
     *
     * @param infoKey 提示key
     * @param defaultMsg 默认值
     * @param locale 指定的位置
     * @param params 参数列表
     * @return 提示信息
     */
    public String getInfoMessage(String infoKey, String defaultMsg, Locale locale, Object... params) {
        return messageSource.getMessage(INFO.concat(infoKey), params, defaultMsg, locale);
    }

    /**
     * 使用测试类型名获取测试信息，没有则返回null
     * <p>
     * 如果名字是test.object，则使用object即可
     *
     * @param testKey 异常类型名
     * @param params 填充信息
     * @return 测试信息
     */
    public String getTestMessage(String testKey, Object... params) {
        return getTestMessage(testKey, null, params);
    }

    /**
     * 使用测试类型名获取测试信息，没有则返回默认值
     * <p>
     * 如果名字是test.object，则使用object即可
     *
     * @param testKey 异常类型名
     * @param defaultMsg 默认值
     * @param params 填充信息
     * @return 测试信息
     */
    public String getTestMessage(String testKey, String defaultMsg, Object... params) {
        return getTestMessage(testKey, defaultMsg, LocaleContextHolder.getLocale(), params);
    }

    /**
     * 使用测试类型名获取Locale的信息，没有则返回默认值
     *
     * @param testKey 测试类型名
     * @param defaultMsg 默认值
     * @param locale 指定的位置
     * @param params 填充信息
     * @return 测试信息
     */
    public String getTestMessage(String testKey, String defaultMsg, Locale locale, Object... params) {
        return messageSource.getMessage(TEST.concat(testKey), params, defaultMsg, locale);
    }

    /**
     * 使用完全限定名获取通用类型信息，没有则返回默认值
     *
     * @param key 完全限定名
     * @param defaultMsg 默认值
     * @param locale 指定的位置
     * @param params 填充信息
     * @return 一般信息
     */
    public String getGenericMessage(String key, String defaultMsg, Locale locale, Object... params) {
        return messageSource.getMessage(key, params, defaultMsg, locale);
    }
}
